/*
1.将两个集合合并
2.询问两个元素是否在一个集合当中 近乎O(1)
*/
/*
基本原理：每一个集合用树来构建，根节点编号是集合的编号
         每个节点存储他的父节点，p[x]表示x的父节点
问题1：如何判断一个点是不是树根：if(p[x] == x)
问题2：如何求x的集合编号：while(p[x] != x) x = p[x]; 一路往上走 [此处需要优化：路径压缩 ]
问题3：如何合并两个集合：px是x的集合编号，py是y的集合编号。p[x] = y
       也就是直接将一颗树插入到另一颗树中就行了，

*/

#include<iostream>

using namespace std;

const int N = 100010;
int n, m;
int p[N];

int find(int x)// 返回x的祖宗节点 + 路径压缩
{
    /*路径压缩：找到该节点的根节点后，将此节点的父节点直接变成根节点，此后查找的时间复杂度就为O(1)*/
    if( p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main(){
    scanf("%d%d", &n, &m);
    //最开始每个树在各自的集合中，安排！
    for(int i = 0; i < n; i++ ){
        p[i] = i;
    }

    while(m--){
        char op[2];
        int a, b;
        scanf("%s%d%d", op, &a, &b);

        if(op[0] == 'M'){
            p[find(a)] = find(b);
        }
        else{
            if(find(a) == find(b)) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}
